package com.mango.leet.code.week1.game286;

/**
 * 5268. 找出两数组的不同
 */
/**
 * 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ，请你返回一个长度为 2 的列表 answer ，其中：
 *
 * answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。
 * answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。
 * 注意：列表中的整数可以按 任意 顺序返回。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums1 = [1,2,3], nums2 = [2,4,6]
 * 输出：[[1,3],[4,6]]
 * 解释：
 * 对于 nums1 ，nums1[1] = 2 出现在 nums2 中下标 0 处，然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中。因此，answer[0] = [1,3]。
 * 对于 nums2 ，nums2[0] = 2 出现在 nums1 中下标 1 处，然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中。因此，answer[1] = [4,6]。
 * 示例 2：
 *
 * 输入：nums1 = [1,2,3,3], nums2 = [1,1,2,2]
 * 输出：[[3],[]]
 * 解释：
 * 对于 nums1 ，nums1[2] 和 nums1[3] 没有出现在 nums2 中。由于 nums1[2] == nums1[3] ，二者的值只需要在 answer[0] 中出现一次，故 answer[0] = [3]。
 * nums2 中的每个整数都在 nums1 中出现，因此，answer[1] = [] 。
 *
 *
 * 提示：
 *
 * 1 <= nums1.length, nums2.length <= 1000
 * -1000 <= nums1[i], nums2[i] <= 1000
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: mango
 * @Date: 2022/3/27 4:33 下午
 */
public class LC5268 {
    class Solution {
        // 排序 + 双指针
        public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            int i = 0, j = 0;
            int n1 = nums1.length;
            int n2 = nums2.length;
            List<Integer> list1 = new ArrayList<>();
            List<Integer> list2 = new ArrayList<>();
            while(i < n1 && j < n2){
                if(nums1[i] == nums2[j]){
                    i++;
                    while(i<n1 && nums1[i]==nums1[i-1]){
                        i++;
                    }
                    j++;
                    while(j<n2 && nums2[j]==nums2[j-1]){
                        j++;
                    }
                }else if(nums1[i] < nums2[j]){
                    if(!list1.contains(nums1[i])){
                        list1.add(nums1[i]);
                    }
                    i++;
                }else if(nums1[i] > nums2[j]){
                    if(!list2.contains(nums2[j])){
                        list2.add(nums2[j]);
                    }
                    j++;
                }
            }
            while(i<n1){
                if(!list1.contains(nums1[i])){
                    list1.add(nums1[i]);
                }
                i++;
            }
            while(j<n2){
                if(!list2.contains(nums2[j])){
                    list2.add(nums2[j]);
                }
                j++;
            }
            List<List<Integer>> result = new ArrayList<>();
            result.add(list1);
            result.add(list2);
            return result;
        }
    }
}
